Leanify [![Build Status](https://travis-ci.org/JayXon/Leanify.svg)](https://travis-ci.org/JayXon/Leanify) [![Windows Build status](https://ci.appveyor.com/api/projects/status/2p9i3ru8apwq2uic?svg=true)](https://ci.appveyor.com/project/JayXon/leanify) [![Download](https://img.shields.io/github/downloads/JayXon/Leanify/latest/total.svg)](https://github.com/JayXon/Leanify/releases) [![Latest Release](https://img.shields.io/github/release/JayXon/Leanify.svg)](https://github.com/JayXon/Leanify/releases/latest) [![GitHub license](https://img.shields.io/github/license/JayXon/Leanify.svg)](LICENSE)
=======

Leanify is a lightweight lossless file minifier/optimizer. It removes unnecessary data (debug information, comments, metadata, etc.) and recompress the file to reduce file size. It will not reduce image quality at all.


##Features

* Support recursive minifying. (e.g. a [PNG] inside an [APK] inside a [ZIP])
* Support a wide variety of [file formats](#file-formats).
* Lightweight, one file, under 1MB, no external dependency.
* Everything is done in memory, no temporary files.
* Cross-Platform, support Windows, Linux, Mac.
* Support traverse directory recursively.
* Ability to identify file format by its data instead of name.


##Disclaimer

I'm not respossible for any consequence of using Leanify.

**PLEASE BACKUP THE FILE BEFORE USING LEANIFY!**


##File Formats


####APK file (.apk)

It is based on [ZIP].
  
Note that modifying files inside `APK` will break digital signature.
To install it, you'll have to sign it again.

If you don't want to modify any files inside `APK`, use `-d 1` option.


####Comic book archive (.cbt, .cbz)

`cbt` is based on [tar]. `cbz` is based on [ZIP].


####Microsoft Office document 2007-2013 (.docx, .xlsx, .pptx)

It is based on [XML] and [ZIP].

Office document 1997-2003 (.doc, .xls, .ppt) is not supported.


####Design Web Format (.dwf, dwfx)

It is based on [ZIP].


####EPUB file (.epub)

It is based on [ZIP].


####FictionBook (.fb2, .fb2.zip)

It is based on [XML].

Leanify embedded images.


####GFT file (.gft)

It's an image container format found in Tencent QQ.

Leanify the image inside.


####gzip file (.gz, .tgz)

Leanify file inside and recompress deflate stream.
  
Remove all optional section: `FEXTRA`, `FNAME`, `FCOMMENT`, `FHCRC`.


####Icon file (.ico)

Leanify [PNG] inside, if any.


####Java archive (.jar)

It is based on [ZIP].


####JPEG image (.jpeg, .jpg, .jpe, .jif, .jfif, .jfi, .thm)

Remove all application markers (e.g. `Exif`) and comments.

Optimize with `mozjpeg`.


####Lua object file (.lua, .luac)

Remove all debugging information:

* Source name
* Line defined and last line defined
* Source line position list
* Local list
* Upvalue list


####OpenDocument (.odt, .ods, .odp, .odb, .odg, .odf)

It is based on [XML] and [ZIP].


####PE file (.exe, .dll, .sys, .ocx, .scr, .cpl)

Leanify embedded resource.

Remove `Relocation Table` in executable file.

Remove undocumented `Rich Header`.

Overlap `PE Header` and `DOS Header`.


####PNG image (.png, .apng)

Remove all ancillary chunks except for:
  
* `tRNS`: transparent information
* `fdAT`, `fcTL`, `acTL`: These chunks are used by `APNG`
* `npTc`: Android 9Patch images (*.9.png)

Optimize with `ZopfliPNG`.


####RDB archive (.rdb)

It is an archive format found in Tencent QQ.

Leanify all files inside.


####Flash file (.swf)

Leanify embedded images.

Recompress it with `LZMA`.
  
Remove Metadata Tag.


####SVG image (.svg, .svgz)
 
It is based on [XML].
  
Remove metadata.

Remove empty attributes.

####tar archive (.tar)

Leanify all files inside.


####XML document (.xml, .xsl, .xslt)

Remove all comments, unnecessary spaces, tabs, line breaks.


####XPInstall (.xpi)

It is based on [ZIP].

Note that modifying files inside `xpi` will break digital signature if exist.
To install it, you'll have to either delete the META-INF folder inside `xpi` or sign it again.


####XPS document (.xps, .oxps)

It is based on [XML] and [ZIP].


####ZIP archive (.zip)

Leanify all files inside and recompress deflate stream using [Zopfli](https://github.com/google/zopfli).

Remove extra field in `Local file header`.

Remove `Data descriptor structure`, write those information to `Local file header`.

Remove extra field and file comment in `Central directory file header`.

Remove comment in `End of central directory record`.



##To do list


####BMP image (.bmp, .dib)


####GIF image (.gif)


####Microsoft Compound File Binary


####PDF document (.pdf)


##Downloads

[Stable Releases](https://github.com/JayXon/Leanify/releases/)

[Windows Nightly Build](https://ci.appveyor.com/project/JayXon/leanify)

[Linux Nightly Build](https://drone.io/github.com/JayXon/Leanify/files)



##Usage

```
Usage: leanify [options] paths
  -i, --iteration <iteration>   More iterations produce better result, but
                                  use more time, default is 15.
  -d, --max_depth <max depth>   Maximum recursive depth, unlimited by default.
                                  Set to 1 will disable recursive minifying.
  -f, --fastmode                Fast mode, no recompression.
  -q, --quiet                   No output to stdout.
  -v, --verbose                 Verbose output.
  --keep-exif                   Do not remove Exif.
```


##Compiling

####Windows

* Visual Studio 2015 or up

  Use Leanify.vcxproj

* gcc 4.7 or up

  run build_gcc.bat


####Linux, Mac

```
make
```



[APK]: #apk-file-apk
[PNG]: #png-image-png-apng
[tar]: #tar-archive-tar
[XML]: #xml-document-xml-xsl-xslt
[ZIP]: #zip-archive-zip
The MIT License (MIT)

Copyright (c) 2014 JayXon

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
